package cn.iocoder.yudao.framework.common.util.rsa;

import cn.hutool.core.codec.Base64;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.config.RsaConfig;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;

/**
 * RSA加密解密工具类
 * 用于解密前端加密的密码
 */
@Component // 标记为Spring组件，使其能被注入到其他类中
@RequiredArgsConstructor // 生成构造函数，用于注入RsaConfig
public class RsaUtils {

    // 注入RSA配置（包含私钥）
    private final RsaConfig rsaConfig;

    /**
     * 私钥解密（核心方法）
     * @param encryptedData 前端加密后的密码（Base64格式）
     * @return 解密后的明文密码
     */
    public String decryptByPrivateKey(String encryptedData) {
        try {
            // 1. 解码加密数据和私钥（前端加密后会用Base64编码）
            byte[] encryptedBytes = Base64.decode(encryptedData);
            byte[] privateKeyBytes = Base64.decode(rsaConfig.getPrivateKey());

            // 2. 初始化私钥
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

            // 3. 执行解密
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return new String(cipher.doFinal(encryptedBytes));
        } catch (Exception e) {
            throw new ServiceException("密码解密失败：" + e.getMessage());
        }
    }

}